package cn.coisini.model.common.sms.impl;

import cn.coisini.model.common.dtos.Result;
import cn.coisini.model.common.enums.ResultEnum;
import cn.coisini.model.common.sms.SmsService;
import cn.coisini.model.common.sms.property.AliyunSmsProperties;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

/**
 * @author xiangshaw
 * Description: 短信服务实现类
 */
@Log4j2
@Service
@RequiredArgsConstructor
public class SmsServiceImpl implements SmsService {

    private final AliyunSmsProperties aliyunSmsProperties;

    /**
     * 发送短信
     *
     * @param mobile 手机号
     * @param smsTemplate 短信模板（SMS_XXX）
     * @param templateParam 模板参数（"[{"code":000000}]"）
     */
    @Override
    public Result<ResultEnum> sendSms(String mobile, String smsTemplate, String templateParam) {
        // 校验参数是否为空，防止发送无效请求
        if (StringUtils.isBlank(mobile) || StringUtils.isBlank(smsTemplate) || StringUtils.isBlank(templateParam)) {
            log.error("发送短信失败，参数缺失: mobile={}, smsTemplate={}, templateParam={}", mobile, smsTemplate, templateParam);
            return Result.error(ResultEnum.DATA_INVALID_PARAMETER);
        }
        // 创建并初始化阿里云API客户端
        DefaultProfile profile = DefaultProfile.getProfile(
                aliyunSmsProperties.getRegionId(),
                aliyunSmsProperties.getAccessKeyId(),
                aliyunSmsProperties.getAccessKeySecret());
        IAcsClient client = new DefaultAcsClient(profile);
        // 发送短信的请求对象
        CommonRequest request = smsCommonRequest(mobile, smsTemplate, templateParam);
        try {
            // 发送请求并接收响应
            CommonResponse response = client.getCommonResponse(request);
            log.info("阿里云短信响应: {}", response.getData());
            if (response.getHttpStatus() == 200) {
                return Result.ok(ResultEnum.SUCCESS);
            } else {
                log.error("短信发送失败，状态码: {}, 响应信息: {}", response.getHttpStatus(), response.getData());
                return Result.error(ResultEnum.FAIL);
            }
        } catch (ServerException e) {
            // 捕获服务器端错误
            log.error("阿里云短信服务端异常: {}", e.getErrMsg(), e);
            return Result.error(ResultEnum.FAIL,"阿里云短信服务端异常");
        } catch (ClientException e) {
            // 捕获客户端异常
            log.error("阿里云短信客户端异常: {}", e.getErrMsg(), e);
            return Result.error(ResultEnum.FAIL,"阿里云短信客户端异常");
        }
    }

    /**
     * 阿里云短信服务的请求对象
     *
     * @param mobile        接收短信的手机号
     * @param smsTemplate   短信模板Code
     * @param templateParam 短信模板的参数
     * @return CommonRequest 对象
     */
    private CommonRequest smsCommonRequest(String mobile, String smsTemplate, String templateParam) {
        // 创建通用的请求对象
        CommonRequest request = new CommonRequest();
        // 指定请求方式为POST
        request.setSysMethod(MethodType.POST);
        // 短信API的请求地址，固定地址
        request.setSysDomain(aliyunSmsProperties.getDomain());
        // API版本号，固定值"2017-05-25"
        request.setSysVersion("2017-05-25");
        // API名称
        request.setSysAction("SendSms");
        // 设置阿里云区域ID
        request.putQueryParameter("RegionId", aliyunSmsProperties.getRegionId());
        // 设置接收短信的手机号
        request.putQueryParameter("PhoneNumbers", mobile);
        // 设置短信签名名称
        request.putQueryParameter("SignName", aliyunSmsProperties.getSignName());
        // 设置短信模板Code
        request.putQueryParameter("TemplateCode", smsTemplate);
        // 设置模板参数，需以JSON字符串格式传递
        request.putQueryParameter("TemplateParam", templateParam);
        return request;
    }
}
